#!/usr/bin/env bash

# 输出一个企鹅图像
printf "
\033[1;30m   .--\"\"--.   
\033[1;30m  /________\\
\033[1;37m | / \033[1;31m>  <\033[1;37m \\\\ |
\033[1;37m \\\\ \\\\ \033[1;33m\\\\/\033[1;37m  / /
\033[1;37m  \`------'  
\033[1;30m /________\\
\033[1;30m/ \033[1;37m('')('')\033[1;30m \\
\033[1;30m| \\\\\033[1;37m      \033[1;30m/ |
\033[1;30m\\\\  \`-----'  /
\033[1;30m \`._______.' 
\033[1;33m  /V\\   /V\\  
\033[1;33m \`\"'   \`\"'  
"

# 获取系统运行的时间（uptime命令看到的时间单位是分钟，/proc/uptime里面看到的时间单位是秒，需要做换算）
upSeconds="$(cut -d. -f1 /proc/uptime)"                                             # 获取系统运行的总秒数
secs=$((upSeconds % 60))                                                            # 计算秒数
mins=$((upSeconds / 60 % 60))                                                       # 计算分钟数
hours=$((upSeconds / 3600 % 24))                                                    # 计算小时数
days=$((upSeconds / 86400))                                                         # 计算天数
UPTIME_INFO=$(printf "%d days, %02dh %02dm %02ds" "$days" "$hours" "$mins" "$secs") # 格式化系统运行时间

# 判断linux发行版
if [ -f /etc/redhat-release ]; then
    PRETTY_NAME=$(</etc/redhat-release) # 获取RedHat发行版信息

elif [ -f /etc/debian_version ]; then
    DIST_VER=$(</etc/debian_version)                                                                       # 获取Debian版本号
    PRETTY_NAME="$(grep PRETTY_NAME /etc/os-release | sed -e 's/PRETTY_NAME=//g' -e 's/"//g') ($DIST_VER)" # 获取Debian发行版信息

else
    PRETTY_NAME=$(cat /etc/*-release | grep "PRETTY_NAME" | sed -e 's/PRETTY_NAME=//g' -e 's/"//g') # 获取其他发行版信息
fi

# 判断当前操作系统是否是虚拟机或容器
if [[ -d "/system/app/" && -d "/system/priv-app" ]]; then
    model="$(getprop ro.product.brand) $(getprop ro.product.model)" # 获取Android设备品牌和型号

elif [[ -f /sys/devices/virtual/dmi/id/product_name ||
    -f /sys/devices/virtual/dmi/id/product_version ]]; then
    model="$(</sys/devices/virtual/dmi/id/product_name)"      # 获取虚拟机或物理机的产品名称
    model+=" $(</sys/devices/virtual/dmi/id/product_version)" # 获取产品版本

elif [[ -f /sys/firmware/devicetree/base/model ]]; then
    model="$(</sys/firmware/devicetree/base/model)" # 获取设备树中的模型信息

elif [[ -f /tmp/sysinfo/model ]]; then
    model="$(</tmp/sysinfo/model)" # 获取临时系统信息中的模型信息
fi

MODEL_INFO=${model}                  # 获取操作系统所在的硬件环境
KERNEL=$(uname -srmo)                # 获取内核版本
USER_NUM=$(who -u | wc -l)           # 获取连接终端的用户数量
RUNNING=$(ps ax | wc -l | tr -d " ") # 获取运行的进程数量

# 获取磁盘信息：磁盘总量以及使用率
totaldisk=$(df -h -x devtmpfs -x tmpfs -x debugfs -x aufs -x overlay --total 2>/dev/null | tail -1)                         # 获取磁盘总量信息
disktotal=$(awk '{print $2}' <<<"${totaldisk}")                                                                             # 提取磁盘总量
diskused=$(awk '{print $3}' <<<"${totaldisk}")                                                                              # 提取已使用磁盘量
diskusedper=$(awk '{print $5}' <<<"${totaldisk}")                                                                           # 提取磁盘使用百分比
DISK_INFO="\033[0;33m${diskused}\033[0m of \033[1;34m${disktotal}\033[0m disk space used (\033[0;33m${diskusedper}\033[0m)" # 格式化磁盘信息

# 获取CPU信息：cpu型号、核心数、逻辑数
cpu=$(awk -F':' '/^model name/ {print $2}' /proc/cpuinfo | uniq | sed -e 's/^[ \t]*//') # 获取CPU型号
cpun=$(grep -c '^processor' /proc/cpuinfo)                                              # 获取逻辑处理器数量
cpuc=$(grep '^cpu cores' /proc/cpuinfo | tail -1 | awk '{print $4}')                    # 获取每个物理处理器的核心数
cpup=$(grep -c '^physical id' /proc/cpuinfo)                                            # 获取物理处理器数量
CPU_INFO="${cpu} ${cpup}P ${cpuc}C ${cpun}L"                                            # 格式化CPU信息

# 获取系统负载情况：1分钟、5分钟、15分钟
read one five fifteen rest </proc/loadavg                                                                                                                                                       # 读取系统负载信息
LOADAVG_INFO="\033[0;33m${one}\033[0m / ${five} / ${fifteen} with \033[1;34m$((cpun * cpuc))\033[0m core(s) at \033[1;34m$(grep '^cpu MHz' /proc/cpuinfo | tail -1 | awk '{print $4}')\033 MHz" # 格式化负载信息

# 获取内存信息：内存总量以及使用率
MEM_INFO="$(cat /proc/meminfo | awk '/MemTotal:/{total=$2/1024/1024;next} /MemAvailable:/{use=total-($2/1024/1024); printf("\033[0;33m%.2fGiB\033[0m of \033[1;34m%.2fGiB\033[0m RAM used (\033[0;33m%.2f%%\033[0m)",use,total,(use/total)*100);}')"

# 获取服务器IP地址
# extranet_ip=" and $(curl -s ip.cip.cc)"
IP_INFO="$(ip a | grep glo | awk '{print $2}' | head -1 | cut -f1 -d/)${extranet_ip:-}" # 获取服务器IP地址
USER_IP=$(echo "$SSH_CLIENT" | awk '{print $1}')                                        # 获取用户的登录IP
if [ -z "$USER_IP" ]; then
    USER_IP=$(who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g') # 获取用户的登录IP--方法2
fi
if [ -z "$USER_IP" ]; then
    USER_IP=$(hostname -I) # 获取用户的登录IP--方法3
fi

# 远程连接后，将以下信息输出到终端
echo -e "
 \033[0;1;31mInformation as of\033[0m..: \033[1;34m$(date +"%Y-%m-%d %T")\033[0m

 \033[0;1;31mProduct\033[0m............: ${MODEL_INFO}
 \033[0;1;31mOS\033[0m.................: ${PRETTY_NAME}
 \033[0;1;31mKernel\033[0m.............: ${KERNEL}
 \033[0;1;31mCPU\033[0m................: ${CPU_INFO}

 \033[0;1;31mHostname\033[0m...........: \033[1;31m$(hostnamectl | grep 'Static hostname' | awk -F ': ' '{print $2}')\033[0m
 \033[0;1;31mIP Addresses\033[0m.......: \033[1;31m${IP_INFO}\033[0m
 \033[0;1;31mssh-Client IP\033[0m.......: \033[1;31m${USER_IP}\033[0m

 \033[0;1;31mUptime\033[0m.............: \033[0;33m${UPTIME_INFO}\033[0m
 \033[0;1;31mMemory\033[0m.............: ${MEM_INFO}
 \033[0;1;31mLoad Averages\033[0m......: ${LOADAVG_INFO}
 \033[0;1;31mDisk Usage\033[0m.........: ${DISK_INFO}

 \033[0;1;31mUsers online\033[0m.......: \033[1;34m${USER_NUM}\033[0m
 \033[0;1;31mRunning Processes\033[0m..: \033[1;34m${RUNNING}\033[0m
"
